package com.mall.b2c.service;

import java.util.Date;

import net.sf.json.JSONObject;

import com.mall.b2c.bean.PayInfo;
import com.mall.b2c.domain.order.OrderDomain;
import com.mall.common.bean.Pager;
import com.mall.common.domain.component.PaymentTypeDomain;
import com.mall.common.service.BaseService;

/**
 * Service接口 - 订单
 * @author 
 */
public interface OrderService extends BaseService<OrderDomain, Long>  {
	
	/**
	 * 生成订单
	 * @param memberId 会员id
	 * @param cartItemIds 购物车项Id
	 * @param payType 付款方式
	 * @param receiverId 收货地址id
	 * @param deliveryMethodId 配送方式id
	 * @param postscript 附言
	 * @param isInvoice 是否开票
	 * @param invoiceType 发票类型
	 * @param invoiceTitle 抬头
	 * @return
	 */
	String createOrder(Long storeId, Long memberId, Long[] cartItemIds, Integer payType,
					   Long receiverId, Long deliveryMethodId, String postscript,
					   Boolean isInvoice, Integer invoiceType, String invoiceTitle);
	
	/**
	 * 立即购买校验
	 * @param memberId 会员id
	 * @param goodsId 商品id
	 * @param num 数量
	 * @return
	 */
	JSONObject checkGoods(Long memberId, Long goodsId, Integer num);
	
	/**
	 * 立即购买
	 * @param memberId 会员id
	 * @param goodsId 商品id
	 * @param num 数量
	 * @param payType 付款方式
	 * @param receiverId 收货地址id
	 * @param deliveryMethodId 配送方式id
	 * @param postscript 附言
	 * @param isInvoice 是否开票
	 * @param invoiceType 发票类型
	 * @param invoiceTitle 抬头
	 * @return
	 */
	String buyNow(Long storeId, Long memberId, Long goodsId, Integer num,
				  Integer payType, Long receiverId, Long deliveryMethodId,
				  String postscript, Boolean isInvoice, Integer invoiceType,
				  String invoiceTitle);
	
	/**
	 * 获取订单信息
	 * @param memberId 会员id
	 * @param orderNo 订单编号
	 * @return
	 */
	OrderDomain getOrderByMemberId(Long memberId, String orderNo);

	/**
	 * 根据付款编号和会员id获取订单
	 * @param tradeNo 付款编号
	 * @param memberId 会员id
	 * @return
	 */
	OrderDomain getOrderByTradeNo(String tradeNo, Long memberId);
	
	/**
	 * 检查付款信息
	 * @param payInfo 付款信息
	 * @return
	 */
	JSONObject checkPayInfo(PayInfo payInfo);


	/**
	 * 检查扫码支付
	 */
	JSONObject checkWftPayInfo(PayInfo payInfo);

	/**
	 * 订单支付
	 * @param tradeNo 支付编号
	 * @param paymentType 支付方式
	 * @param dealId 第三方支付编号
	 */
	void pay(String tradeNo, PaymentTypeDomain paymentType, String dealId);

	/**
	 * 余额支付
	 *
	 * @param orderNo
	 */
	void payCash(Long memberId, String orderNo);
	/**
	 * 拣货（后台操作）
	 * @param orderId
	 * @param username
	 */
	void pickup(Long orderId, String username);

	/**
	 * 订单完成（后台操作）
	 * @param orderId
	 * @param username
	 */
	void complete(Long orderId, String username);

	
	/**
	 * 取消订单（后台操作）
	 * @param orderNo
	 * @param username
	 */
	void cancel(String orderNo, String username);
	
	/**
	 * 删除订单（后台操作）
	 * @param ids
	 * @param username
	 */
	void delete(Long[] ids, String username);

	/**
	 * 订单分页查询
	 * @param keyword 订单编号
	 * @param memberId 会员id
	 * @param startDate 起始时间
	 * @param endDate 结束时间
	 * @param orderStatus 订单状态
	 * @param pagerNumber 页码
	 * @return
	 */
	Pager getOrderPager(String keyword, Long memberId, Date startDate, Date endDate, Integer orderStatus, Integer pagerNumber);

	/**
	 * 订单支付（后台操作）
	 * @param orderNo
	 * @param username
	 * @param memo
	 */
	void offlinePay(String orderNo, String username, String memo);

	/**
	 * 前台取消订单(前台)
	 * @param orderNo
	 * @param memberId
	 */
	void cancelOrder(String orderNo, Long memberId);

	/**
	 * 删除订单(前台)
	 * @param orderNo
	 * @param memberId
	 */
	void deleteOrder(String orderNo, Long memberId);

	/**
	 * 确认收货
	 * @param orderNo
	 * @param memberId
	 */
	void confirmReceive(String orderNo, Long memberId);
}